﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void test1(void)
{
	char str1[] = "hello bit.";
	char str2[] = "hello bit.";
	const char* str3 = "hello bit.";
	const char* str4 = "hello bit.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");
	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");
	return 0;
	/*内容相同的常量字符串只需要保存一份就够了*/
}
int main(void)
{
	{
		//常量字符串
		const char* arr = "hello";		//将字符串中首字符的地址赋给arr;
										//字符串表达式的值是字符串中首字符的地址
		printf("%c\n", *arr);
		printf("%s\n", arr);
		//*arr = 'a';						//不可以修改,语法没问题，运行有问题
										//使用%s打印字符串时，只需要提供首字符串的地址
		test1();
		/*
			这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量字符串存储到单独的⼀个内存区域，
			当⼏个指针指向同⼀个字符串的时候，他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始
			化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同，str3和str4相同。
		*/
	}
	{
		//数组指针
		int arr[10] = { 0 };
		//int[10];			//数组类型
		//int [10] (* ptr)	//数组指针
		int(*ptr)[10] = &arr;
		printf("%p\n", arr);
		printf("%p\n", ptr);
		//arr:				--int * arr+1跳过四个字节
		//&arr[0]:			--int * &arr[0]+1跳过4个字节
		//&arr:				--int *[10] &arr+1跳过40个字节
		char* arr2[5];
		char *(*p)[5] = &arr2;//指针数组指针
		char* (*arrOfP[10])[5];//指针数组指针数组
	}

	return 0;
}
